package main

import (
	"flag"
	"fmt"
	"log"
	"reflect"
	"studay/changestu"
	"studay/datastu"
	"studay/errstu"
	"studay/filstu"
	"studay/forstu"
	"studay/goroutinestu"
	"studay/intstu"
	"studay/poistu"
	"studay/recursionstu"
	"studay/strstu"
	"studay/structstu"
	"studay/varbase"
)

//go run .\ex_httpserver.go -name zhangs
func main() {

	//参数 -name  传入
	//需要调用flag.Parse()
	//类型是指针
	name := flag.String("name", "默认值", "传入名称")
	flag.Parse()
	fmt.Println("名称是: ", *name, "  name type is ", reflect.TypeOf(name))

	//变量
	varbase.VarStuday()
	fmt.Println("常量使用", varbase.Ms3)

	//if语句可以在条件表达式前执行一个简单的语句分号隔开
	//异常
	if _, err := errstu.Es(0); err != nil {
		log.Fatal("发现异常直接退出程序!!!")
	}

	//指针
	iv := 2
	poistu.Add2(&iv)
	fmt.Printf("Go 值传递 通过指针修改原对象的值结果 %d \n", iv)

	//循环
	//forstu.Fo(3)
	forstu.RangeSt()
	fmt.Println("===========================================")

	//切片
	datastu.SliceStu()
	fmt.Println("===========================================")

	//map
	datastu.MapStu()
	fmt.Println("===========================================")

	//可变参数
	changestu.ChangeStu()
	fmt.Println("===========================================")

	//使用其他文件的结构体
	var sstu structstu.Studnte
	sstu.Age = 1
	//sstu.name = "sss"
	fmt.Println(sstu)
	//结构体
	structstu.Sh()

	//接口
	var i1 intstu.File = intstu.PPT{}
	var i2 intstu.File = intstu.Excel{}
	fmt.Println(i1.Extract2txt())
	intstu.Ts(i2)

	//类型转换
	ppt, ok := i1.(intstu.PPT)
	if ok {
		fmt.Println("这是一个ppt文件", reflect.TypeOf(ppt))
	}
	ppt2, ok := i2.(intstu.PPT)
	if ok {
		fmt.Println("这是一个ppt文件", reflect.TypeOf(ppt2))
	} else {
		fmt.Println("不是一个PPT", reflect.TypeOf(i2))
	}

	//编译不会报错 interface conversion: intstu.File is intstu.Excel, not intstu.PPT
	//i2.(intstu.PPT).Extract2txt()

	//error接口
	ii, err := errstu.CheckBig(6)
	if err != nil {
		fmt.Println("异常", err)
	} else {
		fmt.Println(ii)
	}

	//String接口 类似java tostring
	st := strstu.Stu{Age: 18, Name: "张三"}
	fmt.Println(st)

	//空接口 func Accept(v interface{}){}
	// 有点类似java object

	//defer 关键字... 实现类似finally,但是要放前面
	fmt.Println("===========================================")
	filstu.ParseFile("D:\\data\\adv_list")
	filstu.LoopFunc()

	//recursion 递归
	fmt.Println(recursionstu.Add(3))
	fmt.Println(recursionstu.Fibora(6))
	recursionstu.FileTree("D:\\data\\ctr\\test\\")

	//错误堆栈panic , 恢复 recover
	errstu.Trecover()

	//goroutine (协程)
	goroutinestu.Sw()

	//println("请访问: http://localhost:8080/hello")
	//webstu.Web()

	filstu.Cp()

}
